package es.ucm.is.www.GUI.client.units;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.Widget;

import es.ucm.is.www.GUI.client.panels.ErrorPanel;
import es.ucm.is.www.GUI.client.panels.PanelAlert;
import es.ucm.is.www.GUI.client.panels.PanelWaitingRight;

public class ButtonPopupUnit extends Button implements ClickListener{


	public final static int CREATE = 0;
	public final static int DESCRIPTION = 1;	
	
	private int operacion;
	private UnitNoTime b;
	private PanelUnits panel;
	private PopupUnit popup;
	
	public ButtonPopupUnit(String caption,int operacion,UnitNoTime b,PanelUnits panel){
		super(caption);
		this.operacion = operacion;
		this.b = b;
		//this.buildings = buildings;
		this.panel = panel;
		this.addClickListener(this);
	}
	
	public int getOperacion(){
		return operacion;
	}
	
	public void onClick(Widget sender) {
		String s = "";
		switch (operacion){
		case (CREATE):{
			boolean continuar = false;
			if(b.getUnidad().getIdUnit()<=3){
				if(!panel.getUnidadesEnConstruccion().isUnitConstructing()){
					continuar=true;
				}else{
					s = "soldado";
				}
			}else{
				if(!panel.getUnidadesEnConstruccion().isTankConstructing()){
					continuar=true;
				}else{
					s = "tanque";
				}
			}
			if(continuar){
				
				final PanelWaitingRight p = new PanelWaitingRight("CONSTRUYENDO");
				p.mostrar();
				
				UnitsServiceAsync servicio = (UnitsServiceAsync) GWT.create(UnitsService.class);
				ServiceDefTarget endpoint = (ServiceDefTarget) servicio;
				endpoint.setServiceEntryPoint(GWT.getModuleBaseURL() + "servletUnits");
				AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>(){

					public void onFailure(Throwable caught) {

						p.ocultar();
						ErrorPanel error = new ErrorPanel("Error al conectar con el servidor ese...");
						error.center();
						
					}	

					public void onSuccess(Boolean result) {

						if(result){
							startConstruction(p);
						}else{
							p.ocultar();
							ErrorPanel error = new ErrorPanel("No se puede insertar la unidad, recursos insuficientes");
							error.center();
						}
					}
					
				};
					servicio.createUnit(b.getUnidad(), callback);
								
			}else{
				PanelAlert.Alert("ADVERTENCIA", "S&oacute;lo puedes construir un "+ s + " a la vez");
			}
			break;
		}
		case (DESCRIPTION):{
			final PanelWaitingRight p = new PanelWaitingRight("Obteniendo datos...");
			p.mostrar();
			
			UnitsServiceAsync servicio = (UnitsServiceAsync) GWT.create(UnitsService.class);
			ServiceDefTarget endpoint = (ServiceDefTarget) servicio;
			endpoint.setServiceEntryPoint(GWT.getModuleBaseURL() + "servletUnits");
			AsyncCallback<String> callback = new AsyncCallback<String>(){

				public void onFailure(Throwable caught) {

					p.ocultar();
					ErrorPanel error = new ErrorPanel("Error al conectar con el servidor ese...");
					error.center();
					
				}	

				public void onSuccess(String result) {

					if(result != ""){
						p.ocultar();
						b.getUnidad().setDescription(result);
						UnitDescription.showDescription(b.getUnidad(),b.getImg1());
					}else{
						p.ocultar();
						ErrorPanel error = new ErrorPanel("No se piede mostrar la descripci&oacute;n");
						error.center();
					}
				}
				
			};
				servicio.getDescriptionUnit(b.getUnidad().getIdUnit(), callback) ;
							
	
		}
		}
		
	}
	
	public void setPopup(PopupUnit p){
		this.popup = p;
	}
	
	public PopupUnit getPopup(){
		return this.popup;
	}
	
	private void startConstruction(PanelWaitingRight p){
		 UnitBeingConstructed u = new UnitBeingConstructed(panel.getUnidadesEnConstruccion(),
					b.getImg1(), b.getImg2(),
					b.getUnidad().clone(),UnitNoTime.IS_BEING_CONSTRUCTED);
		panel.getUnidadesEnConstruccion().setUnitAndTimeAndStart(u, u.getUnidad().getInitialTime());
		b.setState(UnitNoTime.IS_BEING_CONSTRUCTED);
		p.ocultar();
	}
	
}

